# json字幕解析

import json  # 导入 json 模块以处理 JSON 数据

# 文件配置
input_filename = 'en.json3'  # 输入 JSON 文件名
output_subtitles_file = 'subtitles_output.txt'  # 输出字幕信息文件名
output_texts_file = 'Subtitlesn.txt'  # 输出字幕文本文件名

def getTxt(dat):
    out = ''  # 初始化一个空字符串，用于存储所有字幕文本
    datlist = []  # 初始化一个空列表，用于存储时间偏移和字幕文本

    for i, v in enumerate(dat):  # 遍历字幕片段列表
        tstr = v['utf8']  # 获取当前字幕文本
        out += tstr  # 将字幕文本添加到总字符串中
        offset = 0  # 初始化时间偏移
        if i != 0:
            offset = v['tOffsetMs']  # 如果不是第一个字幕片段，获取其时间偏移
        datlist.append([offset, tstr])  # 将时间偏移和字幕文本添加到列表中
    return [out, datlist]  # 返回包含总字幕文本和时间偏移信息的列表

def decodeJosn(fname):
    jdict = None  # 初始化字典
    with open(fname, 'rb') as f:  # 以二进制模式打开文件
        jdict = json.load(f)  # 读取并解析 JSON 数据

    subtxts = jdict['events']  # 提取字幕事件列表
    alltime = 0  # 初始化总时间
    dats = {}  # 初始化字典以存储字幕事件信息
    outstrs = {}  # 初始化字典以存储非空字幕文本

    for i, v in enumerate(subtxts):  # 遍历每个字幕事件
        if i == 0:
            alltime = v['dDurationMs']  # 记录第一个事件的持续时间
        else:
            st = v['tStartMs']  # 获取开始时间
            dt = 0  # 初始化持续时间
            if 'dDurationMs' in v:
                dt = v['dDurationMs']  # 如果有持续时间，则获取

            if 'segs' in v:  # 如果有字幕片段
                txtdat = getTxt(v['segs'])  # 调用函数获取字幕文本和时间偏移

            dats[i] = [st, dt, txtdat[0], txtdat[1]]  # 存储事件相关信息
            if txtdat[0] != '\n' and len(txtdat[0]) > 0:  # 如果字幕文本不为空
                outstrs[i] = [st, dt, txtdat[0]]  # 存储非空字幕文本
    return dats, outstrs  # 返回两个字典

dats, outstrs = decodeJosn(input_filename)  # 读取指定 JSON 文件并获取字幕数据

with open(output_subtitles_file, 'w', encoding='utf-8') as f:  # 打开文件以写入字幕信息
    for k, v in outstrs.items():  # 遍历字幕字典
        f.write(f"{k}: {v}\n")  # 将事件索引和信息写入文件
print(f"字幕信息已保存到 '{output_subtitles_file}' 文件中。")

subtitle_texts = [v[2] for v in outstrs.values()]  # 提取每个字幕文本
with open(output_texts_file, 'w', encoding='utf-8') as f:  # 打开文件以写入字幕文本
    f.write('\n'.join(subtitle_texts))  # 将字幕文本拼接并写入文件
print(f"提取的字幕文本已保存到 '{output_texts_file}' 文件中。")

